package com.sky.config;

import com.sky.properties.AliOssProperties;
import com.sky.utils.AliOssUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Slf4j
@Configuration
public class OssConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public AliOssUtil aliOssUtil(AliOssProperties aliOssProperties){// todo aliOssProperties怎么就自动赋值了？？？？
//在 Spring 中，这种在 @Bean 方法参数中直接获取其他 Bean 的方式，是 Spring 框架提供的一种隐式注入机制，不需要显式添加 @Autowired 注解。
//具体来说，当你在 @Configuration 类的 @Bean 方法中声明参数时：
//Spring 会自动在 IoC 容器中查找与参数类型匹配的 Bean
//如果找到匹配的 Bean（如这里的 AliOssProperties），就会自动将其注入到方法参数中
//这个过程称为 "方法参数解析"，是 Spring 容器初始化 Bean 时的内置行为
//这种机制的原理是：
//@Bean 方法本质上是 Spring 创建 Bean 的工厂方法
//Spring 在执行这个工厂方法时，会自动解析方法参数
//按照类型（Type）在容器中查找对应的 Bean 进行注入
//所以即使你没有添加 @Autowired 注解，Spring 也会自动完成注入。这是 Spring 针对 @Bean 方法参数提供的特殊处理，目的是简化配置类的编写。
//需要注意的是：
//这种隐式注入要求容器中必须存在对应的 Bean（AliOssProperties）
//如果存在多个同类型 Bean，需要通过 @Qualifier 指定名称
//这种机制只适用于 @Bean 方法的参数，普通组件的依赖注入还是需要 @Autowired 等注解
        log.info("开始创建阿里云上传文件工具类：{}",aliOssProperties);
        return new AliOssUtil(aliOssProperties.getEndpoint(), aliOssProperties.getAccessKeyId(),
                aliOssProperties.getAccessKeySecret(), aliOssProperties.getBucketName());
    }




}















